/**
 * 模块接口错误
 * <p>一般静态代码审查很难看出来，但通过运行程序就能轻易发现
 */
package com.jahentao.unitTest.case02;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * 模块接口调用
 * <p>以调用JDBC接口，连接MySQL数据库为例
 * <p>请确保MySQL已经配置，实验前修改配置文件mysql.properties中的MySQL连接、用户名和密码
 * @author jahentao
 * @date 2018-4-24
 */
public class ModuleInterfaceInvokeExample {

	public void connectAndOperateMysql() throws Exception {
		// 获取配置文件
		Properties properties = new Properties();
		InputStream inputStream = ModuleInterfaceInvokeExample.class.getResourceAsStream("mysql.properties");
		properties.load(inputStream);
		
		
		Connection conn = null;
        String sql;
        // MySQL的JDBC URL编写方式：jdbc:mysql://主机名称：连接端口/数据库的名称?参数=值
        // 避免中文乱码要指定useUnicode和characterEncoding
        // 执行数据库操作之前要在数据库管理系统上创建一个数据库，名字自己定，
        // 下面语句之前就要先创建demo数据库
        String url = properties.getProperty("url");
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
 
        try {
            // 之所以要使用下面这条语句，是因为要使用MySQL的驱动，所以我们要把它驱动起来，
            // 可以通过Class.forName把它加载进去，也可以通过初始化来驱动起来，下面三种形式都可以
            Class.forName("com.mysql.jdbc.Driver");// 动态加载mysql驱动
            // or:
            // com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
            // or：
            // new com.mysql.jdbc.Driver();
 
            System.out.println("成功加载MySQL驱动程序");
            
            // 一个Connection代表一个数据库连接
            conn = DriverManager.getConnection(username, password, url); // 这里设置模块接口调用出错
            
            // Statement里面带有很多方法，比如executeUpdate可以实现插入，更新和删除等
            Statement stmt = conn.createStatement();
            sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
            int result = stmt.executeUpdate(sql);// executeUpdate语句会返回一个受影响的行数，如果返回-1就没有成功
            if (result != -1) {
                System.out.println("创建数据表成功");
                sql = "insert into student(NO,name) values('12345678901','小王')";
                result = stmt.executeUpdate(sql);
                sql = "insert into student(NO,name) values('12345678902','小俊')";
                result = stmt.executeUpdate(sql);
                sql = "select * from student";
                ResultSet rs = stmt.executeQuery(sql);// executeQuery会返回结果的集合，否则返回空值
                System.out.println("学号\t姓名");
                while (rs.next()) {
                    System.out
                            .println(rs.getString(1) + "\t" + rs.getString(2));// 入如果返回的是int类型可以用getInt()
                }
            }
        } catch (SQLException e) {
            System.out.println("MySQL操作错误");
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            conn.close();
        }
	}
	
}
